"""
Markdown 格式导出策略
生成AI友好的Markdown格式参数文档
"""
from __future__ import annotations

from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List

from ..domain import ProjectSnapshot
from .base import ExportStrategy, ExportResult


class MarkdownExportStrategy(ExportStrategy):
    """将项目快照导出为 Markdown 文件"""

    @classmethod
    def get_format_info(cls) -> Dict[str, Any]:
        """获取 Markdown 导出格式信息"""
        return {
            "format": "markdown",
            "name": "Markdown文档",
            "extension": ".md",
            "description": "AI友好的Markdown格式参数文档，包含使用说明和代码示例"
        }

    def __init__(self, output_dir: Path = Path("exports")) -> None:
        self.output_dir = output_dir

    def export(self, snapshot: ProjectSnapshot) -> ExportResult:
        snapshot.ensure_export_time()
        self.output_dir.mkdir(parents=True, exist_ok=True)
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        filename = f"{snapshot.metadata.name_en}_parameters_{timestamp}.md"
        file_path = self.output_dir / filename

        md_content = self._build_markdown_content(snapshot)

        with file_path.open("w", encoding="utf-8") as f:
            f.write(md_content)

        return ExportResult(file_path=file_path, mime_type="text/markdown")

    def get_diff_ignore_fields(self) -> List[str]:
        return []

    def _build_markdown_content(self, snapshot: ProjectSnapshot) -> str:
        """构建Markdown内容"""
        lines = []
        metadata = snapshot.metadata

        # 标题
        lines.append(f"# {metadata.name} 参数文档")
        lines.append("")

        # 使用说明
        lines.append("## 使用说明")
        lines.append("")

        lines.append("### Python客户端使用方式")
        lines.append("")

        lines.append("```python")
        lines.append("from param_management_client import ParameterClient")
        lines.append("")

        lines.append("# 创建客户端")
        lines.append("client = ParameterClient(")
        lines.append("    host='api.anlper.cn',")
        lines.append("    port=80,")
        lines.append(f"    project_name='{metadata.name_en}'")
        lines.append(")")
        lines.append("")

        lines.append("# 获取项目对象")
        lines.append("project = client.get_project()")
        lines.append("")

        lines.append("# 访问参数示例")
        lines.append("# project.<分类名>.<参数名>")
        lines.append("```")
        lines.append("")

        # 基本数据获取说明
        lines.append("### 获取项目基本信息")
        lines.append("")

        lines.append("| 属性名称 | 访问方式 | 说明 |")
        lines.append("|---------|-----------|------|")
        lines.append("| 项目名称 | `project.name` | 项目中文名称 |")
        lines.append("| 项目英文名 | `project.name_en` | 项目英文标识 |")
        lines.append("| 项目描述 | `project.description` | 项目详细描述 |")
        lines.append("| 时间范围 | `project.time_horizon` | 项目时间长度（年） |")
        lines.append("| 起始年份 | `project.start_year` | 项目开始年份 |")
        lines.append("| 年份步长 | `project.year_step` | 年份间隔 |")
        lines.append("| 结束年份 | `project.end_year` | 项目结束年份 |")
        lines.append("| 参数分类 | `project.categories` | 所有分类名称列表 |")
        lines.append("")

        # 灵活操作说明
        lines.append("### 灵活操作")
        lines.append("")

        lines.append("| 操作 | 访问方式 | 说明 |")
        lines.append("|------|----------|------|")
        lines.append("| 获取所有分类 | `project.list_categories()` | 返回所有分类名称列表 |")
        lines.append("| 获取指定分类 | `project['分类名']` 或 `project.分类名` | 获取指定分类对象 |")
        lines.append("| 获取分类下所有参数 | `project.分类名.list_parameters()` | 返回该分类下所有参数名称 |")
        lines.append("| 获取指定参数 | `project['分类名']['参数名']` 或 `project.分类名.参数名` | 获取指定参数对象 |")
        lines.append("| 遍历所有分类 | `for category_name in project:` | 遍历所有分类名称 |")
        lines.append("| 遍历分类下所有参数 | `for param_name in project[category_name]:` | 遍历该分类下所有参数名称 |")
        lines.append("")

        # 分类基本信息获取说明
        lines.append("### 获取分类基本信息")
        lines.append("")

        lines.append("| 属性名称 | 访问方式 | 说明 |")
        lines.append("|---------|-----------|------|")
        lines.append("| 分类名称 | `category.name` | 分类中文名称 |")
        lines.append("| 分类英文名 | `category.name_en` | 分类英文标识 |")
        lines.append("| 分类描述 | `category.description` | 分类详细描述 |")
        lines.append("")

        # 参数基本信息获取说明
        lines.append("### 获取参数基本信息")
        lines.append("")

        lines.append("| 属性名称 | 访问方式 | 说明 |")
        lines.append("|---------|-----------|------|")
        lines.append("| 参数名称 | `param.name` | 参数中文名称 |")
        lines.append("| 参数英文名 | `param.name_en` | 参数英文标识 |")
        lines.append("| 参数值 | `param.value` | 参数当前值 |")
        lines.append("| 参数单位 | `param.unit` | 参数单位 |")
        lines.append("| 参数描述 | `param.description` | 参数详细描述 |")
        lines.append("| 参数类型 | `param.param_type` | 参数数据类型 |")
        lines.append("| 是否列表 | `param.is_list` | 是否为列表类型参数 |")
        lines.append("| 是否关联年份 | `param.is_year_related` | 是否与年份关联 |")
        lines.append("| 列表长度 | `param.list_length` | 列表参数的长度 |")
        lines.append("")

        # 参数分类和参数
        lines.append("## 参数分类")
        lines.append("")

        for category in snapshot.categories:
            # 分类标题
            lines.append(f"### {category.name} ({category.name_en})")
            lines.append("")

            if category.description:
                lines.append(f"**描述**: {category.description}")
                lines.append("")

            # 参数列表
            if category.parameters:
                lines.append("| 参数名称 | 参数英文名 | 类型 | 是否列表 | 是否关联年份 | 列表长度 | 代码访问方式 |")
                lines.append("|---------|-----------|------|----------|-------------|----------|-------------|")

                for param in category.parameters:
                    # 构建代码访问方式
                    code_access = f"project.{category.name_en}.{param.name_en}"

                    # 处理参数值显示
                    param_type = param.param_type
                    is_list = "是" if param.is_list else "否"
                    is_year_related = "是" if param.is_year_related else "否"
                    list_length = param.list_length or len(param.values) if param.is_list else "-"

                    lines.append(
                        f"| {param.name} | {param.name_en} | {param_type} | {is_list} | {is_year_related} | {list_length} | `{code_access}` |"
                    )

                lines.append("")
            else:
                lines.append("*该分类暂无参数*")
                lines.append("")

        lines.append("---")
        export_time_str = (
            snapshot.metadata.export_time.strftime("%Y-%m-%d %H:%M:%S")
            if snapshot.metadata.export_time
            else datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        )
        lines.append(f"*文档生成时间: {export_time_str}*")

        return "\n".join(lines)

